/**
 * 表单验证工具类
 * 基于 @vuelidate/core 和 @vuelidate/validators
 */
import {
  required,
  email,
  minLength,
  maxLength,
  sameAs,
  numeric,
  between,
  alpha,
  alphaNum,
  helpers
} from '@vuelidate/validators'

/**
 * 表单验证规则工厂
 */
export const ValidationRules = {
  /**
   * 必填字段
   * @param message 错误信息
   * @returns 验证规则
   */
  required(message = '此字段为必填项') {
    return helpers.withMessage(message, required)
  },

  /**
   * 电子邮箱
   * @param message 错误信息
   * @returns 验证规则
   */
  email(message = '请输入有效的电子邮箱') {
    return helpers.withMessage(message, email)
  },

  /**
   * 最小长度
   * @param length 最小长度
   * @param message 错误信息
   * @returns 验证规则
   */
  minLength(length: number, message = `最少需要 ${length} 个字符`) {
    return helpers.withMessage(message, minLength(length))
  },

  /**
   * 最大长度
   * @param length 最大长度
   * @param message 错误信息
   * @returns 验证规则
   */
  maxLength(length: number, message = `最多允许 ${length} 个字符`) {
    return helpers.withMessage(message, maxLength(length))
  },

  /**
   * 与指定字段值相同
   * @param field 对比字段
   * @param fieldName 对比字段名称
   * @returns 验证规则
   */
  sameAs(field: any, fieldName = '指定字段') {
    return helpers.withMessage(`必须与${fieldName}相同`, sameAs(field))
  },

  /**
   * 数字
   * @param message 错误信息
   * @returns 验证规则
   */
  numeric(message = '只能输入数字') {
    return helpers.withMessage(message, numeric)
  },

  /**
   * 范围
   * @param min 最小值
   * @param max 最大值
   * @param message 错误信息
   * @returns 验证规则
   */
  between(min: number, max: number, message = `值必须在 ${min} 到 ${max} 之间`) {
    return helpers.withMessage(message, between(min, max))
  },

  /**
   * 仅字母
   * @param message 错误信息
   * @returns 验证规则
   */
  alpha(message = '只能输入字母') {
    return helpers.withMessage(message, alpha)
  },

  /**
   * 字母和数字
   * @param message 错误信息
   * @returns 验证规则
   */
  alphaNum(message = '只能输入字母和数字') {
    return helpers.withMessage(message, alphaNum)
  },

  /**
   * 自定义验证规则
   * @param validator 验证函数
   * @param message 错误信息
   * @returns 验证规则
   */
  custom(validator: (value: any) => boolean, message = '验证失败') {
    return helpers.withMessage(message, validator)
  },

  /**
   * 手机号码验证（中国大陆）
   * @param message 错误信息
   * @returns 验证规则
   */
  mobilePhone(message = '请输入有效的手机号码') {
    const phoneRegex = /^1[3-9]\d{9}$/
    return helpers.withMessage(
      message,
      helpers.regex(phoneRegex)
    )
  },

  /**
   * URL 验证
   * @param message 错误信息
   * @returns 验证规则
   */
  url(message = '请输入有效的URL') {
    const urlRegex = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/
    return helpers.withMessage(
      message,
      helpers.regex(urlRegex)
    )
  },

  /**
   * 密码强度验证
   * 至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符
   * @param message 错误信息
   * @returns 验证规则
   */
  strongPassword(message = '密码必须包含大小写字母、数字和特殊字符') {
    const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,}$/
    return helpers.withMessage(
      message,
      helpers.regex(passwordRegex)
    )
  },

  /**
   * 中文姓名验证
   * @param message 错误信息
   * @returns 验证规则
   */
  chineseName(message = '请输入有效的中文姓名') {
    const nameRegex = /^[\u4e00-\u9fa5]{2,10}$/
    return helpers.withMessage(
      message,
      helpers.regex(nameRegex)
    )
  },

  /**
   * 身份证号验证（中国大陆）
   * @param message 错误信息
   * @returns 验证规则
   */
  idCard(message = '请输入有效的身份证号') {
    // 简单校验，实际应用中可能需要更复杂的校验逻辑
    const idCardRegex = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
    return helpers.withMessage(
      message,
      helpers.regex(idCardRegex)
    )
  }
}

/**
 * 生成表单验证错误信息
 * @param errors 错误对象
 * @returns 错误信息
 */
export const getValidationErrors = (errors: any): Record<string, string> => {
  const result: Record<string, string> = {}
  
  for (const key in errors) {
    if (errors[key].$error) {
      // 获取第一个错误信息
      for (const validator in errors[key].$errors) {
        if (errors[key].$errors[validator].$invalid) {
          result[key] = errors[key].$errors[validator].$message
          break
        }
      }
    }
  }
  
  return result
} 